package com.example.rabc.monitor;

import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 监控事件总线，作为观察者模式的主题实现
 */
@Component
public class MonitorEventBus implements MonitorSubject {
    // 观察者列表，使用CopyOnWriteArrayList避免并发修改异常
    private final List<MonitorObserver> observers = new CopyOnWriteArrayList<>();

    // 添加观察者
    @Override
    public void addObserver(MonitorObserver observer) {
        observers.add(observer);
    }

    // 移除观察者
    @Override
    public void removeObserver(MonitorObserver observer) {
        observers.remove(observer);
    }

    /**
     * 通知所有支持该事件类型的观察者
     * @param event 监控事件
     */
    @Override
    public void notifyObservers(MonitorEvent event) {
        // 遍历所有观察者，筛选支持该事件类型的观察者
        for (MonitorObserver observer : observers) {
            if (observer.supportsEventType(event.getEventType())) {
                // 异步处理避免阻塞
                CompletableFuture.runAsync(() -> observer.update(event));
            }
        }
    }
}